package generic;

import java.util.ArrayList;
import java.util.List;

/**
 * 泛型使用细节
 */
public class GenericDetail {

    public static void main(String[] args) {

        /*
            1)interface List<T> {}, public class HashSet<E>{}...
               T E 只能是引用类型
            2)在给泛型指定具体类型后，可以传入该类型或者其子类型
            3)泛型使用形式
            List<Integer> list1 = new ArrayList<Integer>();
            List<Integer> list2 = new ArrayList<>();
            不指定泛型 默认就是 Object
         */

        //1.给泛型指向数据类型是，要求是引用类型，不能是基本数据类型
        List<Integer> list = new ArrayList<Integer>(); //OK
        //List<int> list2 = new ArrayList<int>();//错误

        //2.因为 E 指定了 A 类型, 构造器传入了 new A()
        //在给泛型指定具体类型后，可以传入该类型或者其子类类型
        Pig<A> aPig = new Pig<A>(new A());
        aPig.f();
        Pig<A> aPig2 = new Pig<A>(new B());
        aPig2.f();

        //3.泛型的使用形式
        ArrayList<Integer> list1 = new ArrayList<Integer>();
        List<Integer> list2 = new ArrayList<Integer>();
        //在实际开发中，往往简写
        ArrayList<Integer> list3 = new ArrayList<>();
        List<Integer> list4 = new ArrayList<>();
        ArrayList<Pig> pigs = new ArrayList<>();

        ArrayList arrayList = new ArrayList();//等价 ArrayList<Object> arrayList = new ArrayList<Object>();


    }
}

class Tiger<E> {

    E e;

    public Tiger() {}

    public Tiger(E e) {
        this.e = e;
    }
}

class A {}

class B extends A {}

class Pig<E> {

    E e;

    public Pig(E e) {
        this.e = e;
    }

    public void f() {
        System.out.println(e.getClass());//运行类型
    }
}